#!/usr/bin/env python
# -*- coding: UTF-8 -*-  

#--------- 外部模块处理<<开始>> ---------#

#-----系统自带必备模块引用-----

import sys # 操作系统模块
import socket
import requests

#-----系统外部需安装库模块引用-----

import tornado.httpserver
import tornado.ioloop
import tornado.options
import tornado.web
import tornado.websocket

from tornado.options import define, options

#-----DIY自定义库模块引用-----

import config # 主配置参数
import diy.inc_sys as inc_sys # 自定义系统功能函数模块

class IndexHandler(tornado.web.RequestHandler):
    
    def run_it(self,**kwargs):
    
        url_t = ""
        
        result_p = ""
        
        str_url_add = ""
        
        str_arguments = ""
        
        #print (self.request.arguments)
        
        # 获得用户端提交的参数
        for x in self.request.arguments:
            
            # 特殊提交值处理 整体作为内容传递给均衡后的最后一级输出
            if (x == "url_add"):
            
                str_url_add += self.request.arguments[x][0].decode("utf-8")
                
            else:
            
                str_arguments += "&" + x + "=" + self.request.arguments[x][0].decode("utf-8")
        
        
        # 无参数 默认导向 即无参数web调用不做均衡处理 
        if (str_arguments.strip() == "" and config.root_balance != "yes"):
        
            self.redirect(config.url_default)
            
            return ""
        
        str_arguments = "?" + str_arguments
        
        headers = {"User-Agent": ("Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) "
                          "Chrome/56.0.2924.87 Safari/537.36")}
        i = 1
        while (i <= len(config.list_route)*2):
            
            result_p = ""
            
            url_t = config.list_route[0]  
        
            #url_t =  url_t.replace("127.0.0.1","127.0.0.1")
            
            #路由栈切换到下一个路由网址
            
            config.list_route.pop(0)
        
            config.list_route.append(url_t)
            
            # 路由测试
            
            try:
            
                html = requests.get(url=url_t + "/" + config.function_test, timeout=3, headers=headers, verify=False)
            
                result_p = str(html.text.encode(html.encoding,errors="ignore"), encoding="utf-8")
            
            except Exception as e:
            
                print("\n" + url_t + "网址路由测试错误：",e,"\n")
            
            #print(i,url_t,result_p) # 调试用
            
            # 此处根据负载均衡服务器的路由接口返回约定判断，链路是否通畅
            if (not result_p is None):
            
                if(result_p.strip() != ""):
                    
                    # 重启服务或报警
                    
                    break
            
            i += 1
        
        if (result_p.strip() != ""):
            
            if (str_url_add.strip() != ""):
            
                url_t += "/" + str_url_add
            
            else:
            
                url_t += "/" + str_arguments
                
            #self.write(url_t)
            
            self.redirect(url_t)
            
        else:
        
            self.write(result_p)
        
        return ""
        
    def get(self):
        
        #print("\n[API模式]用户提交方式:","get")
        
        self.run_it()
        
    def post(self):
    
        #print("\n[API模式]用户提交方式:","post")
        self.run_it()

#--------- 外部模块处理<<结束>> ---------#

#--------- 内部模块处理<<开始>> ---------#

# ---外部参变量处理

# ---全局变量处理
###config_web_start###

#mvc配置_start

settings = {
    "template_path": './views',    #前台渲染模板文件路径
    "static_path": './statics/',    #静态文件路径
    "static_url_prefix": '/statics/',  #静态文件前缀
    "cookie_secret": "bZJc2derneeos6GkHn/VB9oXwQt8S0R0kRvJ5/xJ89E=",    #构造函数中指定cookie_secret参数
    "login_url": "/login",
    "autoreload":False,
    "debug": False,
    #"xsrf_cookies": True,    #防止cookie的跨站访问攻击
    #"xheaders":True,
    }
    
#mvc配置_end

#web路由配置_start
handler_list = [
    (r"/", IndexHandler),    #主页
    ]
#web路由配置_end

###config_web_end###

# ---本模块内部类或函数定义区
    
# 根据操作系统差异进行的差异操作
def os_difference_do():
    
    os_is = inc_sys.operating_system_check(action_p="default")
    
    if(os_is == "win32"):
        
        print("\n操作系统是：windows")
        
    elif(os_is == "linux"):
    
        print("\n操作系统是：linux")

def web_start():
    
    define("port", default=80, help="run on the given port", type=int)
    
    tornado.options.parse_command_line()
    
    app = tornado.web.Application(handler_list, **settings)
    
    http_server = tornado.httpserver.HTTPServer(app, )
    
    http_server.listen(options.port)

    tornado.ioloop.IOLoop.instance().start()

#--------- 内部模块处理<<结束>> ---------#

#---------- 主过程<<开始>> -----------#

def main():

    # 说明字典
    dic_note = {
    "版权":["丽垚人工智能工作室"],
    "作者":["集体","吉更"],
    "初创时间":["2025年1月"],
    "功能":"丽华问答机器人负载均衡主服务",
    "版本":"1.0.2"
    }
    
    inc_sys.version(dic_p=dic_note) # 打印版本
    
    os_difference_do() # 差异化操作
    
    web_start() #启动网站伺服主程序

if __name__ == "__main__":
    
    main()
    
#---------- 主过程<<结束>> -----------#